knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE)
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5 ✓ purrr 0.3.4
## ✓ tibble 3.1.6 ✓ dplyr 1.0.7
## ✓ tidyr 1.1.4 ✓ stringr 1.4.0
## ✓ readr 2.1.1 ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(here)
## here() starts at /Users/devinngo/Desktop/ESM 244/Labs/esm244-w2022-lab1
library(sf)
## Linking to GEOS 3.8.1, GDAL 3.2.1, PROJ 7.2.1; sf_use_s2() is TRUE
library(tmap)
### install.packages('tmap')
### update.packages(ask = FALSE)
cmd-shift-enter shortcut for running the current code chunk
sf_trees <- read_csv(here("data", "sf_trees", "sf_trees.csv"),
show_col_types = FALSE)
Example 1: Find counts of observation by ‘legal_status’ & wrangle a bit.
### method 1: group by() %>% summarize()
sf_trees %>%
group_by(legal_status) %>%
summarize(tree_count = n())
## # A tibble: 10 × 2
## legal_status tree_count
## <chr> <int>
## 1 DPW Maintained 141725
## 2 Landmark tree 42
## 3 Permitted Site 39732
## 4 Planning Code 138.1 required 971
## 5 Private 163
## 6 Property Tree 316
## 7 Section 143 230
## 8 Significant Tree 1648
## 9 Undocumented 8106
## 10 <NA> 54
### method 2: different way plus a few new functions
top_5_status <- sf_trees %>%
count(legal_status) %>%
drop_na(legal_status) %>%
rename(tree_count = n) %>%
relocate(tree_count) %>%
slice_max(tree_count, n = 5) %>%
arrange(desc(tree_count))
Make a graph of the top 5 from above
ggplot(data = top_5_status, aes(x = fct_reorder(legal_status, tree_count), y = tree_count)) +
geom_col(fill = "darkgreen") +
labs(x = "Legal Status", y = "Tree Count") +
coord_flip() +
theme_minimal()
Example 2: Only going to keep observations where legal status is “Permitted Site” and caretaker is “MTA”, and store as permitted_data_df
shift-cmd-c to comment/uncomment quickly
# sf_trees$legal_status %>% unique()
# unique(sf_trees$caretaker)
permitted_data_df <- sf_trees %>%
filter(legal_status %in% c("Permitted Site", "Private") & caretaker %in% "MTA")
Example 3: Only keep Blackwood Acacia trees, and then only keep columns legal_status, date, latitude, longitude and store as blackwood_acacia_df
blackwood_acacia_df <- sf_trees %>%
filter(str_detect(species, "Blackwood Acacia")) %>%
select(legal_status, date, lat = latitude, lon = longitude)
### Make a little graph of locations
ggplot(data = blackwood_acacia_df, aes (x = lon, y = lat)) +
geom_point(color = "darkgreen")
Example 4: use tidyr::separate()
sf_trees_sep <- sf_trees %>%
separate(species, into = c("spp_scientific", "spp_common"), sep = " :: ")
Example 5: use tidyr::unite()
ex_5 <- sf_trees %>%
unite("id_status", tree_id, legal_status, sep = "_COOL_")
Step 1: Convert the lat/lon to spatial point, st_as_sf()
blackwood_acacia_sf <- blackwood_acacia_df %>%
drop_na(lat, lon) %>%
st_as_sf(coords = c('lon', 'lat'))
### we need to tell R what the coordinate reference system is
st_crs(blackwood_acacia_sf) <- 4326
ggplot(data = blackwood_acacia_sf) +
geom_sf(color = "darkgreen") +
theme_minimal()
Read in the SF shapefile and add to map
sf_map <- read_sf(here("data", "sf_map", "tl_2017_06075_roads.shp"))
sf_map_transform <- st_transform(sf_map, 4326)
ggplot(data = sf_map_transform) +
geom_sf()
Combine the maps
ggplot() +
geom_sf(data = sf_map,
size = .1,
color = "darkgrey") +
geom_sf(data = blackwood_acacia_sf,
color = "red",
size = 0.5) +
theme_void() +
labs(title = "Blackwood acacias in SF")
tmap_mode("view")
tm_shape(blackwood_acacia_sf) +
tm_dots()